Реализация отметки строк флажками в табличном поле

Иногда требуется дать возможность пользователю отметить определенные строки табличного поля, чтобы выполнить над ними определенное действие. Например, построить отчет только по выбранным группам товаров, сформировать пачку для Пенсионного фонда только для отмеченных сотрудников и другие подобные задачи.

Версия 1С:Предприятия 8 предоставляет простой механизм для реализации такой функциональности. В колонке табличного поля можно легко отобразить флажок, который пользователь сможет переключать одинарным щелчком мыши. Список отмеченных элементов можно хранить в переменной модуля, которая будет являться одной из универсальных коллекций значений.

Ниже приведены два примера. Первый пример показывает реализацию отметки строк в табличном поле, связанном с таблицей значений, а второй пример — при отображении динамического списка, например, списка элементов справочника "Номенклатура".


Пример 1. Отметка строк в табличном поле, связанном с таблицей значений

Основные принципы реализации этой возможности следующие:

  1. Список отмеченных строк нужно хранить, например, в коллекции типа "Соответствие".
  2. Текущее состояние флажков нужно отображать с помощью обработчика события ПриВыводеСтроки.
  3. Отслеживать переключение флажка и соответствующим образом изменять коллекцию в обработчике события "ПриИзмененииФлажка".

Например, ниже представлен модуль формы обработки, в диалоге которой размещено табличное поле, тип значения которой "ТаблицаЗначений". В редакторе форм в это табличное поле добавлены следующие колонки:

В модуле формы размещены приведенные ниже процедуры. Обратите внимание, что процедуры тпСотрудникиПриВыводеСтроки и тпСотрудникиПриИзмененииФлажка являются обработчиками событий табличного поля, т.е. они назначены в палитре свойств для соответствующих событий.

Копировать в буфер обмена
Перем ОтмеченныеСотрудники; //соответствие

/////////////////////////////////////////////////////////////////////////
//эта процедура вызывается всякий раз, когда система выводит строку табличного поля
//если данный сотрудник есть в списке ОтмеченныеСотрудники, то выводится флажок в колонка Отметка
///////////////////////////////////////////////////////////////////////// 
Процедура тпСотрудникиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ОформлениеСтроки.Ячейки.Отметка.ОтображатьФлажок = Истина;
 		
Если ОтмеченныеСотрудники[ДанныеСтроки] = Неопределено Тогда
      ОформлениеСтроки.Ячейки.Отметка.Флажок = Ложь;
Иначе
     ОформлениеСтроки.Ячейки.Отметка.Флажок = Истина;
	КонецЕсли;
КонецПроцедуры

/////////////////////////////////////////////////////////////////////////
//эта процедура вызывается, когда пользователь изменяет состояние флажка в колонке "Отметка"
//если данного сотрудника нет в списке ОтмеченныеСотрудники, то он туда добавляется, иначе удаляется из списка
///////////////////////////////////////////////////////////////////////// 
Процедура тпСотрудникиПриИзмененииФлажка(Элемент, Колонка)
Если Колонка.Имя = "Отметка" Тогда
Если ОтмеченныеСотрудники[Элемент.ТекущаяСтрока] = Неопределено Тогда
      ОтмеченныеСотрудники[Элемент.ТекущаяСтрока] = Истина;
Иначе
      ОтмеченныеСотрудники.Удалить(Элемент.ТекущаяСтрока);
КонецЕсли;
КонецЕсли;
КонецПроцедуры                            

/////////////////////////////////////////////////////////////////////////
//эта процедура выводит только отмеченных сотрудников 
// или сообщает о том, что не отмечено ни одного сотрудника
///////////////////////////////////////////////////////////////////////// 
Процедура тпСотрудникиПоказатьОтмеченные(Элемент)
Если ОтмеченныеСотрудники.Количество() = 0 Тогда
      Сообщить("Не отмечен ни один сотрудник!"); 
Иначе
      Сообщить("Отмечены следующие сотрудники:");
      Для Каждого Сотр Из ОтмеченныеСотрудники Цикл
             Сообщить(Сотр.Ключ.ФИО);	
      КонецЦикла; 
КонецЕсли;
КонецПроцедуры

/////////////////////////////////////////////////////////////////////////
//создаем пока пустой список отмеченных сотрудников
/////////////////////////////////////////////////////////////////////////
ОтмеченныеСотрудники = Новый Соответствие;
//НАЧАЛЬНОЕ ЗАПОЛНЕНИЕ ТАБЛИЧНОГО ПОЛЯ тпСотрудники
Сотр = тпСотрудники.Добавить();
Сотр.ФИО = "Иванов И.С.";
Сотр = тпСотрудники.Добавить();
Сотр.ФИО = "Петров П.С.";
Сотр = тпСотрудники.Добавить();
Сотр.ФИО = "Сидоров С.А.";

Пример 2. Отметка строк в табличном поле, отображающем динамический список

Аналогичным образом можно реализовать отметку строк для динамического списка, например, элементов справочника или документов. Ниже показано табличное поле, отображающее список элементов справочника "Номенклатура".

Программный модуль, реализующий отметку строк в динамическом списке, приведен ниже. Обратите внимание, что теперь список отмеченных элементов хранится не в объекте типа "Соответствие", как в предыдущем примере, а в объекте типа "СписокЗначений". Это сделано исключительно для демонстрации гибкости платформы 1С:Предприятия 8.0.

Копировать в буфер обмена
Перем ОтмеченныеТовары; //список значений
/////////////////////////////////////////////////////////////////////////
Процедура тпНоменклатураПриИзмененииФлажка(Элемент, Колонка)
	Если Колонка.Имя = "Отметка" Тогда
		НайденныйЭлемент = ОтмеченныеТовары.НайтиПоЗначению(Элемент.ТекущаяСтрока);
		Если НайденныйЭлемент = Неопределено Тогда
     		ОтмеченныеТовары.Добавить(Элемент.ТекущаяСтрока);
		Иначе
      		ОтмеченныеТовары.Удалить(НайденныйЭлемент);
		КонецЕсли; 
	КонецЕсли; 

КонецПроцедуры
/////////////////////////////////////////////////////////////////////////
Процедура тпНоменклатураПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	ОформлениеСтроки.Ячейки.Отметка.ОтображатьФлажок = Истина;
	Если ОтмеченныеТовары.НайтиПоЗначению(ДанныеСтроки.Ссылка) = Неопределено Тогда
	     ОформлениеСтроки.Ячейки.Отметка.Флажок = Ложь;
  	Иначе
	     ОформлениеСтроки.Ячейки.Отметка.Флажок = Истина;
  	КонецЕсли;
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////
Процедура тпНоменклатураПоказатьОтмеченные(Элемент)
	Если ОтмеченныеТовары.Количество()=0 Тогда
		Сообщить("Не отмечен ни один товар!"); 
	Иначе
		Сообщить("Отмечены следующие товары:");
		Для Каждого Товар Из ОтмеченныеТовары Цикл
      		Сообщить(Товар.Значение.Наименование);	
		КонецЦикла; 
	КонецЕсли;
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////
ОтмеченныеТовары = Новый СписокЗначений;

Вы можете посмотреть внешнюю обработку "marks.epf", в которой содержатся два приведенных выше примера. Обратите внимание, что для просмотра второго примера требуется, чтобы в конфигурации был справочник "Номенклатура".

Внешняя обработка с примерами находится на CD-ROM в каталоге \1CITS\EXE\Examples81

Копировать